<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<link rel="STYLESHEET" href="lib.css" type='text/css' />
<link rel="SHORTCUT ICON" href="../icons/pyfav.png" type="image/png" />
<link rel='start' href='../index.html' title='Python documentation Index' />
<link rel="first" href="lib.html" title='Python library Reference' />
<link rel='contents' href='contents.html' title="Contents" />
<link rel='index' href='genindex.html' title='Index' />
<link rel='last' href='about.html' title='About this document...' />
<link rel='help' href='about.html' title='About this document...' />
<link rel="next" href="ctypes-surprises.html" />
<link rel="prev" href="ctypes-callback-functions.html" />
<link rel="parent" href="ctypes-ctypes-tutorial.html" />
<link rel="next" href="ctypes-surprises.html" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name='aesop' content='information' />
<title>14.14.1.18 Accessing values exported from dlls</title>
</head>
<body>
<div class="navigation">
<div id='top-navigation-panel' xml:id='top-navigation-panel'>
<table align="center" width="100%" cellpadding="0" cellspacing="2">
<tr>
<td class='online-navigation'><a rel="prev" title="14.14.1.17 callback functions"
  href="ctypes-callback-functions.html"><img src='../icons/previous.png'
  border='0' height='32'  alt='Previous Page' width='32' /></a></td>
<td class='online-navigation'><a rel="parent" title="14.14.1 ctypes tutorial"
  href="ctypes-ctypes-tutorial.html"><img src='../icons/up.png'
  border='0' height='32'  alt='Up one Level' width='32' /></a></td>
<td class='online-navigation'><a rel="next" title="14.14.1.19 Surprises"
  href="ctypes-surprises.html"><img src='../icons/next.png'
  border='0' height='32'  alt='Next Page' width='32' /></a></td>
<td align="center" width="100%">Python Library Reference</td>
<td class='online-navigation'><a rel="contents" title="Table of Contents"
  href="contents.html"><img src='../icons/contents.png'
  border='0' height='32'  alt='Contents' width='32' /></a></td>
<td class='online-navigation'><a href="modindex.html" title="Module Index"><img src='../icons/modules.png'
  border='0' height='32'  alt='Module Index' width='32' /></a></td>
<td class='online-navigation'><a rel="index" title="Index"
  href="genindex.html"><img src='../icons/index.png'
  border='0' height='32'  alt='Index' width='32' /></a></td>
</tr></table>
<div class='online-navigation'>
<b class="navlabel">Previous:</b>
<a class="sectref" rel="prev" href="ctypes-callback-functions.html">14.14.1.17 Callback functions</a>
<b class="navlabel">Up:</b>
<a class="sectref" rel="parent" href="ctypes-ctypes-tutorial.html">14.14.1 ctypes tutorial</a>
<b class="navlabel">Next:</b>
<a class="sectref" rel="next" href="ctypes-surprises.html">14.14.1.19 Surprises</a>
</div>
<hr /></div>
</div>
<!--End of Navigation Panel-->

<h3><a name="SECTION001614118000000000000000"></a><a name="ctypes-accessing-values-exported-from-dlls"></a>
<br>
14.14.1.18 Accessing values exported from dlls
</h3>

<p>
Sometimes, a dll not only exports functions, it also exports
variables. An example in the Python library itself is the
<code>Py_OptimizeFlag</code>, an integer set to 0, 1, or 2, depending on the
<b class="programopt">-O</b> or <b class="programopt">-OO</b> flag given on startup.

<p>
<code>ctypes</code> can access values like this with the <tt class="method">in_dll</tt> class
methods of the type.  <var>pythonapi</var> ìs a predefined symbol giving
access to the Python C api:
<div class="verbatim"><pre>
&gt;&gt;&gt; opt_flag = c_int.in_dll(pythonapi, "Py_OptimizeFlag")
&gt;&gt;&gt; print opt_flag
c_long(0)
&gt;&gt;&gt;
</pre></div>

<p>
If the interpreter would have been started with <b class="programopt">-O</b>, the sample
would have printed <code>c_long(1)</code>, or <code>c_long(2)</code> if <b class="programopt">-OO</b> would have
been specified.

<p>
An extended example which also demonstrates the use of pointers
accesses the <code>PyImport_FrozenModules</code> pointer exported by Python.

<p>
Quoting the Python docs: <em>This pointer is initialized to point to an
array of ``struct _frozen`` records, terminated by one whose members
are all NULL or zero. When a frozen module is imported, it is searched
in this table. Third-party code could play tricks with this to provide
a dynamically created collection of frozen modules.</em>

<p>
So manipulating this pointer could even prove useful. To restrict the
example size, we show only how this table can be read with
<code>ctypes</code>:
<div class="verbatim"><pre>
&gt;&gt;&gt; from ctypes import *
&gt;&gt;&gt;
&gt;&gt;&gt; class struct_frozen(Structure):
...     _fields_ = [("name", c_char_p),
...                 ("code", POINTER(c_ubyte)),
...                 ("size", c_int)]
...
&gt;&gt;&gt;
</pre></div>

<p>
We have defined the <code>struct _frozen</code> data type, so we can get the
pointer to the table:
<div class="verbatim"><pre>
&gt;&gt;&gt; FrozenTable = POINTER(struct_frozen)
&gt;&gt;&gt; table = FrozenTable.in_dll(pythonapi, "PyImport_FrozenModules")
&gt;&gt;&gt;
</pre></div>

<p>
Since <code>table</code> is a <code>pointer</code> to the array of <code>struct_frozen</code>
records, we can iterate over it, but we just have to make sure that
our loop terminates, because pointers have no size. Sooner or later it
would probably crash with an access violation or whatever, so it's
better to break out of the loop when we hit the NULL entry:
<div class="verbatim"><pre>
&gt;&gt;&gt; for item in table:
...    print item.name, item.size
...    if item.name is None:
...        break
...
__hello__ 104
__phello__ -104
__phello__.spam 104
None 0
&gt;&gt;&gt;
</pre></div>

<p>
The fact that standard Python has a frozen module and a frozen package
(indicated by the negative size member) is not wellknown, it is only
used for testing. Try it out with <code>import __hello__</code> for example.

<p>

<div class="navigation">
<div class='online-navigation'>
<p></p><hr />
<table align="center" width="100%" cellpadding="0" cellspacing="2">
<tr>
<td class='online-navigation'><a rel="prev" title="14.14.1.17 callback functions"
  href="ctypes-callback-functions.html"><img src='../icons/previous.png'
  border='0' height='32'  alt='Previous Page' width='32' /></a></td>
<td class='online-navigation'><a rel="parent" title="14.14.1 ctypes tutorial"
  href="ctypes-ctypes-tutorial.html"><img src='../icons/up.png'
  border='0' height='32'  alt='Up one Level' width='32' /></a></td>
<td class='online-navigation'><a rel="next" title="14.14.1.19 Surprises"
  href="ctypes-surprises.html"><img src='../icons/next.png'
  border='0' height='32'  alt='Next Page' width='32' /></a></td>
<td align="center" width="100%">Python Library Reference</td>
<td class='online-navigation'><a rel="contents" title="Table of Contents"
  href="contents.html"><img src='../icons/contents.png'
  border='0' height='32'  alt='Contents' width='32' /></a></td>
<td class='online-navigation'><a href="modindex.html" title="Module Index"><img src='../icons/modules.png'
  border='0' height='32'  alt='Module Index' width='32' /></a></td>
<td class='online-navigation'><a rel="index" title="Index"
  href="genindex.html"><img src='../icons/index.png'
  border='0' height='32'  alt='Index' width='32' /></a></td>
</tr></table>
<div class='online-navigation'>
<b class="navlabel">Previous:</b>
<a class="sectref" rel="prev" href="ctypes-callback-functions.html">14.14.1.17 Callback functions</a>
<b class="navlabel">Up:</b>
<a class="sectref" rel="parent" href="ctypes-ctypes-tutorial.html">14.14.1 ctypes tutorial</a>
<b class="navlabel">Next:</b>
<a class="sectref" rel="next" href="ctypes-surprises.html">14.14.1.19 Surprises</a>
</div>
</div>
<hr />
<span class="release-info">Release 2.5.1, documentation updated on 18th April, 2007.</span>
</div>
<!--End of Navigation Panel-->
<address>
See <i><a href="about.html">About this document...</a></i> for information on suggesting changes.
</address>
</body>
</html>
